/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Pojo;

import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeSupport;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.List;
import javax.persistence.Basic;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import javax.persistence.Transient;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlTransient;

/**
 *
 * @author jeferson
 */
@Entity
@Table(name = "TB_PRODUTO", catalog = "musical", schema = "")
@XmlRootElement
@NamedQueries({
    @NamedQuery(name = "TbProduto.findAll", query = "SELECT t FROM TbProduto t"),
    @NamedQuery(name = "TbProduto.findByProCodigo", query = "SELECT t FROM TbProduto t WHERE t.proCodigo = :proCodigo"),
    @NamedQuery(name = "TbProduto.findByProTitulo", query = "SELECT t FROM TbProduto t WHERE t.proTitulo = :proTitulo"),
    @NamedQuery(name = "TbProduto.findByProMidia", query = "SELECT t FROM TbProduto t WHERE t.proMidia = :proMidia"),
    @NamedQuery(name = "TbProduto.findByProAno", query = "SELECT t FROM TbProduto t WHERE t.proAno = :proAno"),
    @NamedQuery(name = "TbProduto.findByProFaixas", query = "SELECT t FROM TbProduto t WHERE t.proFaixas = :proFaixas"),
    @NamedQuery(name = "TbProduto.findByProCapa", query = "SELECT t FROM TbProduto t WHERE t.proCapa = :proCapa"),
    @NamedQuery(name = "TbProduto.findByProQuantidade", query = "SELECT t FROM TbProduto t WHERE t.proQuantidade = :proQuantidade"),
    @NamedQuery(name = "TbProduto.findByProValor", query = "SELECT t FROM TbProduto t WHERE t.proValor = :proValor")})
public class TbProduto implements Serializable {
    @Transient
    private PropertyChangeSupport changeSupport = new PropertyChangeSupport(this);
    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Basic(optional = false)
    @Column(name = "PRO_CODIGO")
    private Long proCodigo;
    @Column(name = "PRO_TITULO")
    private String proTitulo;
    @Column(name = "PRO_MIDIA")
    private String proMidia;
    @Column(name = "PRO_ANO")
    private String proAno;
    @Column(name = "PRO_FAIXAS")
    private String proFaixas;
    @Column(name = "PRO_CAPA")
    private String proCapa;
    @Column(name = "PRO_QUANTIDADE")
    private Integer proQuantidade;
    // @Max(value=?)  @Min(value=?)//if you know range of your decimal fields consider using these annotations to enforce field validation
    @Column(name = "PRO_VALOR")
    private BigDecimal proValor;
    @JoinColumn(name = "PRO_CODGRAVADORA", referencedColumnName = "GRA_CODIGO")
    @ManyToOne
    private TbGravadora proCodgravadora;
    @JoinColumn(name = "PRO_CODARTISTA", referencedColumnName = "ART_CODIGO")
    @ManyToOne
    private TbArtista proCodartista;
    @JoinColumn(name = "PRO_CODCATEGORIA", referencedColumnName = "CAT_CODIGO")
    @ManyToOne
    private TbCategoria proCodcategoria;
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "tbProduto")
    private List<TbVendaProduto> tbVendaProdutoList;

    public TbProduto() {
    }

    public TbProduto(Long proCodigo) {
        this.proCodigo = proCodigo;
    }

    public Long getProCodigo() {
        return proCodigo;
    }

    public void setProCodigo(Long proCodigo) {
        Long oldProCodigo = this.proCodigo;
        this.proCodigo = proCodigo;
        changeSupport.firePropertyChange("proCodigo", oldProCodigo, proCodigo);
    }

    public String getProTitulo() {
        return proTitulo;
    }

    public void setProTitulo(String proTitulo) {
        String oldProTitulo = this.proTitulo;
        this.proTitulo = proTitulo;
        changeSupport.firePropertyChange("proTitulo", oldProTitulo, proTitulo);
    }

    public String getProMidia() {
        return proMidia;
    }

    public void setProMidia(String proMidia) {
        String oldProMidia = this.proMidia;
        this.proMidia = proMidia;
        changeSupport.firePropertyChange("proMidia", oldProMidia, proMidia);
    }

    public String getProAno() {
        return proAno;
    }

    public void setProAno(String proAno) {
        String oldProAno = this.proAno;
        this.proAno = proAno;
        changeSupport.firePropertyChange("proAno", oldProAno, proAno);
    }

    public String getProFaixas() {
        return proFaixas;
    }

    public void setProFaixas(String proFaixas) {
        String oldProFaixas = this.proFaixas;
        this.proFaixas = proFaixas;
        changeSupport.firePropertyChange("proFaixas", oldProFaixas, proFaixas);
    }

    public String getProCapa() {
        return proCapa;
    }

    public void setProCapa(String proCapa) {
        String oldProCapa = this.proCapa;
        this.proCapa = proCapa;
        changeSupport.firePropertyChange("proCapa", oldProCapa, proCapa);
    }

    public Integer getProQuantidade() {
        return proQuantidade;
    }

    public void setProQuantidade(Integer proQuantidade) {
        Integer oldProQuantidade = this.proQuantidade;
        this.proQuantidade = proQuantidade;
        changeSupport.firePropertyChange("proQuantidade", oldProQuantidade, proQuantidade);
    }

    public BigDecimal getProValor() {
        return proValor;
    }

    public void setProValor(BigDecimal proValor) {
        BigDecimal oldProValor = this.proValor;
        this.proValor = proValor;
        changeSupport.firePropertyChange("proValor", oldProValor, proValor);
    }

    public TbGravadora getProCodgravadora() {
        return proCodgravadora;
    }

    public void setProCodgravadora(TbGravadora proCodgravadora) {
        TbGravadora oldProCodgravadora = this.proCodgravadora;
        this.proCodgravadora = proCodgravadora;
        changeSupport.firePropertyChange("proCodgravadora", oldProCodgravadora, proCodgravadora);
    }

    public TbArtista getProCodartista() {
        return proCodartista;
    }

    public void setProCodartista(TbArtista proCodartista) {
        TbArtista oldProCodartista = this.proCodartista;
        this.proCodartista = proCodartista;
        changeSupport.firePropertyChange("proCodartista", oldProCodartista, proCodartista);
    }

    public TbCategoria getProCodcategoria() {
        return proCodcategoria;
    }

    public void setProCodcategoria(TbCategoria proCodcategoria) {
        TbCategoria oldProCodcategoria = this.proCodcategoria;
        this.proCodcategoria = proCodcategoria;
        changeSupport.firePropertyChange("proCodcategoria", oldProCodcategoria, proCodcategoria);
    }

    @XmlTransient
    public List<TbVendaProduto> getTbVendaProdutoList() {
        return tbVendaProdutoList;
    }

    public void setTbVendaProdutoList(List<TbVendaProduto> tbVendaProdutoList) {
        this.tbVendaProdutoList = tbVendaProdutoList;
    }

    @Override
    public int hashCode() {
        int hash = 0;
        hash += (proCodigo != null ? proCodigo.hashCode() : 0);
        return hash;
    }

    @Override
    public boolean equals(Object object) {
        // TODO: Warning - this method won't work in the case the id fields are not set
        if (!(object instanceof TbProduto)) {
            return false;
        }
        TbProduto other = (TbProduto) object;
        if ((this.proCodigo == null && other.proCodigo != null) || (this.proCodigo != null && !this.proCodigo.equals(other.proCodigo))) {
            return false;
        }
        return true;
    }

    @Override
    public String toString() {
        return proTitulo;
    }

    public void addPropertyChangeListener(PropertyChangeListener listener) {
        changeSupport.addPropertyChangeListener(listener);
    }

    public void removePropertyChangeListener(PropertyChangeListener listener) {
        changeSupport.removePropertyChangeListener(listener);
    }
    
}
